# 其他是剩余的所有不常见的二手车辆成交的比例


import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import os

def generate_plots(df):
    """生成可视化图表"""
    # 检查必要的列是否存在
    required_columns = ['车龄', '里程数', '车型']
    missing_columns = [col for col in required_columns if col not in df.columns]
    if missing_columns:
        print(f"错误：缺少必要的列: {missing_columns}")
        print("可用的列:", df.columns.tolist())
        return
        
    # 创建输出目录
    output_dir = "./images"
    os.makedirs(output_dir, exist_ok=True)
    
    # 设置中文字体
    plt.rcParams['font.sans-serif'] = ['SimHei']
    plt.rcParams['axes.unicode_minus'] = False
    
    try:
        # === 1. 绘制车龄与里程数散点图 ===
        plt.figure(figsize=(12, 7))
        
        plt.scatter(
            x=df['车龄'],
            y=df['里程数'],
            color='blue',
            alpha=0.6,
            edgecolor='black',
            s=50
        )
        
        # 设置坐标轴范围和刻度
        plt.xlim(0, df['车龄'].max() + 1)
        plt.ylim(0, df['里程数'].max() * 1.1)
        
        # 添加标题和轴标签
        plt.title("车龄与驾驶里程数的散点图", fontsize=14, pad=20)
        plt.xlabel("车龄（年）", fontsize=12)
        plt.ylabel("行驶里程（万公里）", fontsize=12)
        
        # 网格和边框
        plt.grid(True, linestyle='--', alpha=0.5)
        plt.gca().spines['top'].set_visible(False)
        plt.gca().spines['right'].set_visible(False)
        
        plt.tight_layout()
        plt.savefig(f"{output_dir}/age_mileage_scatter.png", dpi=300, bbox_inches='tight')
        plt.close()
        
        print("成功生成散点图")

        # === 2. 绘制车型分布饼图 ===
        plt.figure(figsize=(12, 8))
    
        # 统计各车型的数量和比例
        car_type_counts = df['车型'].value_counts()
        percentages = car_type_counts / len(df) * 100
        
        # 保留前10个最常见车型
        top_n = 10
        filtered_counts = car_type_counts.head(top_n)
        filtered_percentages = percentages.head(top_n)
        
        if len(car_type_counts) > top_n:
            filtered_counts['其他'] = car_type_counts[top_n:].sum()
            filtered_percentages['其他'] = percentages[top_n:].sum()
        
        # 设置颜色方案
        colors = plt.cm.Pastel1(np.linspace(0, 1, len(filtered_counts)))
        
        # 绘制饼图（不显示标签）
        plt.pie(
            filtered_counts,
            colors=colors,
            startangle=90,
            wedgeprops={'edgecolor': 'white', 'linewidth': 1.5}
        )
        
        # 创建图例标签（包含车型名称、数量和百分比）
        legend_labels = [
            f'{name}\n({count}辆, {percentage:.1f}%)'
            for name, count, percentage in zip(
                filtered_counts.index,
                filtered_counts.values,
                filtered_percentages.values
            )
        ]
        
        # 添加图例（放在右侧）
        plt.legend(
            legend_labels,
            title="车型分布",
            loc="center left",
            bbox_to_anchor=(1.0, 0.5),
            fontsize=9
        )
        
        # 添加标题
        plt.title("青岛二手车车型分布", fontsize=14, pad=20)
        
        # 确保饼图为正圆形
        plt.axis('equal')
        
        # 调整布局以适应图例
        plt.tight_layout()
        
        # 保存图表（确保有足够空间显示图例）
        plt.savefig(
            f"{output_dir}/car_type_distribution_pie.png",
            bbox_inches='tight',
            dpi=300,
            pad_inches=0.5
        )
        plt.close()
        
        print("成功生成饼图")
    except Exception as e:
        print(f"生成图表时出错: {str(e)}")